/*************************************************************************
	> File Name: oj-46.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2021年01月09日 星期六 14时31分31秒
 ************************************************************************/
#include <iostream>
#include <string>
using namespace std;

#define MAX_N 500000
int dp[MAX_N + 5];
//dp[i] 取前i位字符串最少能构成的回文子串的段数 
//dp从1开始 dp[0] 表示不取字符
//状态转移方程
//dp[i] = min(dp[j]) + 1 | 条件：字符串s的j到i-1位必须是回文串
//复杂度O(n^2)
//需要优化，因为状态转移阶段效率低

bool is_palindrome(string &s, int i, int j) {
    while (i < j) {
        if (s[i++] - s[j--]) return false;
    }
    return true;
}

int main() {
    string s;
    cin >> s;
    dp[0] = 0;
    for (int i = 1; i <= s.size(); ++i) {
        dp[i] = dp[i - 1] + 1;
        for (int j = 0; j < i; ++j) {
            if (is_palindrome(s, j, i - 1)) {
                dp[i] = min(dp[i], dp[j] + 1);
            }
        }
    }
    cout << dp[s.size()] - 1 << endl; //切出的段数-1才是切的刀数
    return 0;
}
